# -*- coding: utf-8 -*-
import requests as rq
import pandas as pd
import jieba
import re
from bs4 import BeautifulSoup as bs
from pymongo import MongoClient

##连接数据库
client=MongoClient()
#创建数据库
database=client['qingdian']
#创建集合
db=database['noval']

save_data=[]#保存完整数据
#获取前面5页的信息
for page in range(1,6):
    #伪装浏览器
    header = {'User-Agent':'Chrome/55.0.2883.75 Safari/537.36'}
    #构造url
    url='https://www.qidian.com/all/page{}/'.format(str(page))
    #获取网页源代码
    sources = rq.get(url,headers = header)
    soup=bs(sources.content,'lxml')
    #获取标题，定位标签为h4
    info1=soup.find_all('h4')
    #获取p标签里面作者信息，包括作者名字、风格、状态
    info2=soup.find_all('p',class_="author")
    #获取小说简介
    info3=soup.find_all('p',class_="intro")
    for i,j,k in zip(info1,info2,info3):
        fiction={}
        fiction['标题']=i.get_text()
        fiction['作者']=j.get_text().split('|')[0].strip()#去两个空格
        fiction['风格']=j.get_text().split('|')[1]
        fiction['状态']=j.get_text().split('|')[2]
        fiction['简介']=k.get_text().strip()
        save_data.append(fiction)

#保存到mongodb数据库当中
db.insert(save_data)

'''
在查找Mongodb数据库时，程序不要和上面程序一起运行，会叠加
'''
#查找小说风格，并对小说风格进行文本分析
content=[x for x in db.find()]
#提取每个小说的风格
style=[]
for n in content:
    style.append(n["风格"])


##对风格进行文本处理分析
stopwords = [line.strip() for line in open('哈工大停用词表.txt', 'r', encoding='utf-8').readlines()]     
stop=[re.sub('|\n|\ufeff','',r)for r in stopwords]

#分词
cut_after=[]
for l in style:
    cut_after.append(' '.join(jieba.cut(l)))

#去停用词
cut_stop=[[''.join(i) for i in s if i not in stop] for s in cut_after]


#画图词云
from wordcloud import WordCloud
import matplotlib.pyplot as plt

#词频统计
#重组词组
num_word=[''.join(i)for i in cut_stop]
num_word=''.join(num_word)#词组全部放在一起
num_word=re.sub(' ','',num_word)
#计算词频
num=pd.Series(jieba.lcut(num_word)).value_counts()

# 绘制词云
my_cloud = WordCloud(
    background_color='white',  # 设置背景颜色  默认是black
    font_path='simhei.ttf',   # 设置字体  显示中文
).fit_words(num)

'''
#扩展
1.fit_words:根据词频生成词云图
2.generate:根据文本生成词云图
3.generate_from_frequencies(frequencies[,...]):根据词频生成词云图
4.generate_from_text(text):根据文本生成词云
5.process_text(text):将长文本拆分成单词，消除词尾
6.recolor
'''
# 显示生成的词云图片
plt.imshow(my_cloud)
# 显示设置词云图中无坐标轴
plt.axis('off')
plt.show()
#保存词运图片
my_cloud.to_file('My_cloud.jpg')

'''
由生成的图片可以看出，小说的写作风格偏向仙侠、玄幻、幻想、历史、东方、科幻等方面
''' 


